{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Tce3stUlHN0L"
      },
      "source": [
        "##### Copyright 2024 Google LLC."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "form",
        "id": "tuOe1ymfHZPu"
      },
      "outputs": [],
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "STuxHh6kk3eL"
      },
      "source": [
        "# Training a Text Classifier Using Embeddings"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wUmTFPw2W_UD"
      },
      "source": [
        "<table class=\"tfo-notebook-buttons\" align=\"left\">\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://ai.google.dev/gemini-api/tutorials/text_classifier_embeddings\"><img src=\"https://ai.google.dev/static/site-assets/images/docs/notebook-site-button.png\" height=\"32\" width=\"32\" />View on ai.google.dev</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/google/generative-ai-docs/blob/main/site/en/gemini-api/tutorials/text_classifier_embeddings.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />Run in Google Colab</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://github.com/google/generative-ai-docs/blob/main/site/en/gemini-api/tutorials/text_classifier_embeddings.ipynb\"><img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" />View source on GitHub</a>\n",
        "  </td>\n",
        "</table>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "bhT1u-Pof10V"
      },
      "source": [
        "## Overview\n",
        "\n",
        "In this notebook, you'll learn to use the embeddings produced by the Gemini API to train a model that can classify different types of newsgroup posts based on the topic.\n",
        "\n",
        "In this tutorial, you'll train a classifier to predict which class a newsgroup post belongs to.\n",
        "\n",
        "## Prerequisites\n",
        "\n",
        "You can run this quickstart in Google Colab.\n",
        "\n",
        "To complete this quickstart on your own development environment, ensure that your envirmonement meets the following requirements:\n",
        "\n",
        "-  Python 3.9+\n",
        "-  An installation of `jupyter` to run the notebook.\n",
        "\n",
        "## Setup\n",
        "\n",
        "First, download and install the Gemini API Python library."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "FXq0ygI3BCdQ"
      },
      "outputs": [],
      "source": [
        "!pip install -U -q google-generativeai"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "XiJjB2vWCQJP"
      },
      "outputs": [],
      "source": [
        "import re\n",
        "import tqdm\n",
        "import keras\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "\n",
        "import google.generativeai as genai\n",
        "\n",
        "# Used to securely store your API key\n",
        "from google.colab import userdata\n",
        "\n",
        "import seaborn as sns\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "from keras import layers\n",
        "from matplotlib.ticker import MaxNLocator\n",
        "from sklearn.datasets import fetch_20newsgroups\n",
        "import sklearn.metrics as skmetrics"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "_mwJYXpElYJc"
      },
      "source": [
        "### Grab an API Key\n",
        "\n",
        "Before you can use the Gemini API, you must first obtain an API key. If you don't already have one, create a key with one click in Google AI Studio.\n",
        "\n",
        "<a class=\"button button-primary\" href=\"https://makersuite.google.com/app/apikey\" target=\"_blank\" rel=\"noopener noreferrer\">Get an API key</a>\n",
        "\n",
        "In Colab, add the key to the secrets manager under the \"🔑\" in the left panel. Give it the name `API_KEY`.\n",
        "\n",
        "Once you have the API key, pass it to the SDK. You can do this in two ways:\n",
        "\n",
        "* Put the key in the `GOOGLE_API_KEY` environment variable (the SDK will automatically pick it up from there).\n",
        "* Pass the key to `genai.configure(api_key=...)`"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "tayrk_A2lZ7A"
      },
      "outputs": [],
      "source": [
        "# Or use `os.getenv('API_KEY')` to fetch an environment variable.\n",
        "API_KEY=userdata.get('API_KEY')\n",
        "\n",
        "genai.configure(api_key=API_KEY)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "WKXa-Pf9lv4H"
      },
      "source": [
        "Key Point: Next, you will choose a model. Any embedding model will work for this tutorial, but for real applications it's important to choose a specific model and stick with it. The outputs of different models are not compatible with each other."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "l1pfEvNflvYV"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "models/embedding-001\n",
            "models/embedding-001\n"
          ]
        }
      ],
      "source": [
        "for m in genai.list_models():\n",
        "  if 'embedContent' in m.supported_generation_methods:\n",
        "    print(m.name)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "C5B9sWq0hNEV"
      },
      "source": [
        "## Dataset\n",
        "\n",
        "The [20 Newsgroups Text Dataset](https://scikit-learn.org/0.19/datasets/twenty_newsgroups.html){:.external} contains 18,000 newsgroups posts on 20 topics divided into training and test sets. The split between the training and test datasets are based on messages posted before and after a specific date. For this tutorial, you will be using the subsets of the training and test datasets. You will preprocess and organize the data into Pandas dataframes."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "jDoKis4om-Ea"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['alt.atheism',\n",
              " 'comp.graphics',\n",
              " 'comp.os.ms-windows.misc',\n",
              " 'comp.sys.ibm.pc.hardware',\n",
              " 'comp.sys.mac.hardware',\n",
              " 'comp.windows.x',\n",
              " 'misc.forsale',\n",
              " 'rec.autos',\n",
              " 'rec.motorcycles',\n",
              " 'rec.sport.baseball',\n",
              " 'rec.sport.hockey',\n",
              " 'sci.crypt',\n",
              " 'sci.electronics',\n",
              " 'sci.med',\n",
              " 'sci.space',\n",
              " 'soc.religion.christian',\n",
              " 'talk.politics.guns',\n",
              " 'talk.politics.mideast',\n",
              " 'talk.politics.misc',\n",
              " 'talk.religion.misc']"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "newsgroups_train = fetch_20newsgroups(subset='train')\n",
        "newsgroups_test = fetch_20newsgroups(subset='test')\n",
        "\n",
        "# View list of class names for dataset\n",
        "newsgroups_train.target_names"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "hDz9MjkNl_FD"
      },
      "source": [
        "Here is an example of what a data point from the training set looks like."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "FPq-56AimOPX"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Lines: 15\n",
            "\n",
            " I was wondering if anyone out there could enlighten me on this car I saw\n",
            "the other day. It was a 2-door sports car, looked to be from the late 60s/\n",
            "early 70s. It was called a Bricklin. The doors were really small. In addition,\n",
            "the front bumper was separate from the rest of the body. This is \n",
            "all I know. If anyone can tellme a model name, engine specs, years\n",
            "of production, where this car is made, history, or whatever info you\n",
            "have on this funky looking car, please e-mail.\n",
            "\n",
            "Thanks,\n",
            "- IL\n",
            "   ---- brought to you by your neighborhood Lerxst ----\n",
            "\n",
            "\n",
            "\n",
            "\n",
            "\n"
          ]
        }
      ],
      "source": [
        "idx = newsgroups_train.data[0].index('Lines')\n",
        "print(newsgroups_train.data[0][idx:])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "A9-DD7wgCx8j"
      },
      "source": [
        "Now you will begin preprocessing the data for this tutorial. Remove any sensitive information like names, email, or redundant parts of the text like `\"From: \"` and `\"\\nSubject: \"`. Organize the information into a Pandas dataframe so it is more readable."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "urpLwp3UmPF3"
      },
      "outputs": [],
      "source": [
        "def preprocess_newsgroup_data(newsgroup_dataset):\n",
        "  # Apply functions to remove names, emails, and extraneous words from data points in newsgroups.data\n",
        "  newsgroup_dataset.data = [re.sub(r'[\\w\\.-]+@[\\w\\.-]+', '', d) for d in newsgroup_dataset.data] # Remove email\n",
        "  newsgroup_dataset.data = [re.sub(r\"\\([^()]*\\)\", \"\", d) for d in newsgroup_dataset.data] # Remove names\n",
        "  newsgroup_dataset.data = [d.replace(\"From: \", \"\") for d in newsgroup_dataset.data] # Remove \"From: \"\n",
        "  newsgroup_dataset.data = [d.replace(\"\\nSubject: \", \"\") for d in newsgroup_dataset.data] # Remove \"\\nSubject: \"\n",
        "\n",
        "  # Cut off each text entry after 5,000 characters\n",
        "  newsgroup_dataset.data = [d[0:5000] if len(d) > 5000 else d for d in newsgroup_dataset.data]\n",
        "\n",
        "  # Put data points into dataframe\n",
        "  df_processed = pd.DataFrame(newsgroup_dataset.data, columns=['Text'])\n",
        "  df_processed['Label'] = newsgroup_dataset.target\n",
        "  # Match label to target name index\n",
        "  df_processed['Class Name'] = ''\n",
        "  for idx, row in df_processed.iterrows():\n",
        "    df_processed.at[idx, 'Class Name'] = newsgroup_dataset.target_names[row['Label']]\n",
        "\n",
        "  return df_processed"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "JMKddQdNnAOV"
      },
      "outputs": [
        {
          "data": {
            "application/vnd.google.colaboratory.intrinsic+json": {
              "summary": "{\n  \"name\": \"df_train\",\n  \"rows\": 11314,\n  \"fields\": [\n    {\n      \"column\": \"Text\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"samples\": [\n          \" CYCLONE AND TEMPEST?????\\nArticle-I.D.: usenet.1pskav$qtu\\nReply-To:  \\nOrganization: Case Western Reserve University, Cleveland, OH \\nLines: 10\\nNNTP-Posting-Host: thor.ins.cwru.edu\\n\\n\\nCould someone please post any info on these systems.\\n\\nThanks.\\nBoB\\n-- \\n---------------------------------------------------------------------- \\nRobert Novitskey | \\\"Pursuing women is similar to banging one's head\\n  |  against a wall...with less opportunity for reward\\\" \\n---------------------------------------------------------------------- \\n\",\n          \" Re: does dos6 defragment??\\nArticle-I.D.: ux1.ardie.272.734097933\\nOrganization: Department of Plant Pathology\\nLines: 30\\n\\nIn article <>   writes:\\n> \\n>Subject: Re: does dos6 defragment??\\n>Date: Tue, 6 Apr 1993 04:02:54 GMT\\n>In article <>,   writes:\\n>|> Geoffrey S. Elbo writes:\\n>|> \\n>|> >Yes, and it is the fastest defrag I've ever watched.  It did a 170MB \\n>|> >hard disk in 20 minutes.\\n>|> \\n>|> \\tI found the MS defrag looks very much like Norton Speedisk.\\n>|> Is it just a strip-down version of the later?\\n>|> \\n>|> \\tI have both Norton Speedisk and Backup, so I was wondering \\n>|> if I need to install MS Backup?\\n>|> \\n>|> Richard\\n>|> \\n>\\n>Yes, defragger IS come from Norton.\\n>If you have Norton Utility, don't bother.\\n\\n\\n     Don't bother if you have CPBackup or Fastback.  They all offer options \\nnot available in the stripped-down MS version .  Examples - no \\nproprietary format , probably no direct DMA access, and no \\ntape drive!\\n\\n     You NEED MS Defrag if you use doublespace to work on the compressed \\nvolume.\\n\",\n          \" For Sale:  Misc IBM stuff\\nOrganization: The Cellar BBS and public access system\\nLines: 10\\n\\n5.25\\\" Internal Low density disk drive.\\n\\nMonochrome monitor\\n\\n8088 motherboard, built in parallel and serial ports, built in mono and\\ncolor output, 7Mhz.\\n\\nLibertarian, atheist, semi-anarchal Techno-Rat.\\n\\nI define \\n\"\n        ],\n        \"num_unique_values\": 11314,\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Label\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 5,\n        \"min\": 0,\n        \"max\": 19,\n        \"samples\": [\n          7,\n          17,\n          9\n        ],\n        \"num_unique_values\": 20,\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Class Name\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"samples\": [\n          \"rec.autos\",\n          \"talk.politics.mideast\",\n          \"rec.sport.baseball\"\n        ],\n        \"num_unique_values\": 20,\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}",
              "type": "dataframe",
              "variable_name": "df_train"
            },
            "text/html": [
              "\n",
              "  <div id=\"df-0706d1b7-41bb-4649-86e8-e6a5b6bad65d\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Text</th>\n",
              "      <th>Label</th>\n",
              "      <th>Class Name</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>WHAT car is this!?\\nNntp-Posting-Host: rac3.w...</td>\n",
              "      <td>7</td>\n",
              "      <td>rec.autos</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>SI Clock Poll - Final Call\\nSummary: Final ca...</td>\n",
              "      <td>4</td>\n",
              "      <td>comp.sys.mac.hardware</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>PB questions...\\nOrganization: Purdue Univers...</td>\n",
              "      <td>4</td>\n",
              "      <td>comp.sys.mac.hardware</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>Re: Weitek P9000 ?\\nOrganization: Harris Comp...</td>\n",
              "      <td>1</td>\n",
              "      <td>comp.graphics</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>Re: Shuttle Launch Question\\nOrganization: Sm...</td>\n",
              "      <td>14</td>\n",
              "      <td>sci.space</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-0706d1b7-41bb-4649-86e8-e6a5b6bad65d')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-0706d1b7-41bb-4649-86e8-e6a5b6bad65d button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-0706d1b7-41bb-4649-86e8-e6a5b6bad65d');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-4654e17e-48a8-46e9-b6dd-182587903bdf\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-4654e17e-48a8-46e9-b6dd-182587903bdf')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-4654e17e-48a8-46e9-b6dd-182587903bdf button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "text/plain": [
              "                                                Text  Label  \\\n",
              "0   WHAT car is this!?\\nNntp-Posting-Host: rac3.w...      7   \n",
              "1   SI Clock Poll - Final Call\\nSummary: Final ca...      4   \n",
              "2   PB questions...\\nOrganization: Purdue Univers...      4   \n",
              "3   Re: Weitek P9000 ?\\nOrganization: Harris Comp...      1   \n",
              "4   Re: Shuttle Launch Question\\nOrganization: Sm...     14   \n",
              "\n",
              "              Class Name  \n",
              "0              rec.autos  \n",
              "1  comp.sys.mac.hardware  \n",
              "2  comp.sys.mac.hardware  \n",
              "3          comp.graphics  \n",
              "4              sci.space  "
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Apply preprocessing function to training and test datasets\n",
        "df_train = preprocess_newsgroup_data(newsgroups_train)\n",
        "df_test = preprocess_newsgroup_data(newsgroups_test)\n",
        "\n",
        "df_train.head()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ogEGbg5XDv-T"
      },
      "source": [
        "Next, you will sample some of the data by taking 100 data points in the training dataset, and dropping a few of the categories to run through this tutorial. Choose the science categories to compare."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "C2N7xXhJohLR"
      },
      "outputs": [],
      "source": [
        "def sample_data(df, num_samples, classes_to_keep):\n",
        "  df = df.groupby('Label', as_index = False).apply(lambda x: x.sample(num_samples)).reset_index(drop=True)\n",
        "\n",
        "  df = df[df['Class Name'].str.contains(classes_to_keep)]\n",
        "\n",
        "  # Reset the encoding of the labels after sampling and dropping certain categories\n",
        "  df['Class Name'] = df['Class Name'].astype('category')\n",
        "  df['Encoded Label'] = df['Class Name'].cat.codes\n",
        "\n",
        "  return df"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "jS2g_ZGupBUb"
      },
      "outputs": [],
      "source": [
        "TRAIN_NUM_SAMPLES = 100\n",
        "TEST_NUM_SAMPLES = 25\n",
        "CLASSES_TO_KEEP = 'sci' # Class name should contain 'sci' in it to keep science categories\n",
        "df_train = sample_data(df_train, TRAIN_NUM_SAMPLES, CLASSES_TO_KEEP)\n",
        "df_test = sample_data(df_test, TEST_NUM_SAMPLES, CLASSES_TO_KEEP)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "j04TMPY8rV5q"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "Class Name\n",
              "sci.crypt          100\n",
              "sci.electronics    100\n",
              "sci.med            100\n",
              "sci.space          100\n",
              "dtype: int64"
            ]
          },
          "execution_count": 11,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "df_train.value_counts('Class Name')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "qMsnfkVDsJlU"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "Class Name\n",
              "sci.crypt          25\n",
              "sci.electronics    25\n",
              "sci.med            25\n",
              "sci.space          25\n",
              "dtype: int64"
            ]
          },
          "execution_count": 12,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "df_test.value_counts('Class Name')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Kr-WlKzXjYWn"
      },
      "source": [
        "## Create the embeddings\n",
        "\n",
        "In this section, you will see how to generate embeddings for a piece of text using the embeddings from the Gemini API. To learn more about embeddings, visit the [embeddings guide](https://ai.google.dev/docs/embeddings_guide).\n",
        "\n",
        "**NOTE**: Embeddings are computed one at a time, large sample sizes can take a long time!"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "yPECMeE2xYA_"
      },
      "source": [
        "### API changes to Embeddings embedding-001\n",
        "\n",
        "For the new embeddings model, there is a new task type parameter and the optional title (only valid with task_type=`RETRIEVAL_DOCUMENT`).\n",
        "\n",
        "These new parameters apply only to the newest embeddings models.The task types are:\n",
        "\n",
        "Task Type | Description\n",
        "---       | ---\n",
        "RETRIEVAL_QUERY\t| Specifies the given text is a query in a search/retrieval setting.\n",
        "RETRIEVAL_DOCUMENT | Specifies the given text is a document in a search/retrieval setting.\n",
        "SEMANTIC_SIMILARITY\t| Specifies the given text will be used for Semantic Textual Similarity (STS).\n",
        "CLASSIFICATION\t| Specifies that the embeddings will be used for classification.\n",
        "CLUSTERING\t| Specifies that the embeddings will be used for clustering."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "MTBGKkPQsotz"
      },
      "outputs": [],
      "source": [
        "from tqdm.auto import tqdm\n",
        "tqdm.pandas()\n",
        "\n",
        "from google.api_core import retry\n",
        "\n",
        "def make_embed_text_fn(model):\n",
        "\n",
        "  @retry.Retry(timeout=300.0)\n",
        "  def embed_fn(text: str) -> list[float]:\n",
        "    # Set the task_type to CLASSIFICATION.\n",
        "    embedding = genai.embed_content(model=model,\n",
        "                                    content=text,\n",
        "                                    task_type=\"classification\")\n",
        "    return embedding['embedding']\n",
        "\n",
        "  return embed_fn\n",
        "\n",
        "def create_embeddings(model, df):\n",
        "  df['Embeddings'] = df['Text'].progress_apply(make_embed_text_fn(model))\n",
        "  return df"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "AH0yrHUHtHtw"
      },
      "outputs": [
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "65e92937e9ca4a0bb81466310b866c2a",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "  0%|          | 0/400 [00:00<?, ?it/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "data": {
            "application/vnd.jupyter.widget-view+json": {
              "model_id": "e2f6127ed420422f91dcc81d8cd52d62",
              "version_major": 2,
              "version_minor": 0
            },
            "text/plain": [
              "  0%|          | 0/100 [00:00<?, ?it/s]"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "model = 'models/embedding-001'\n",
        "df_train = create_embeddings(model, df_train)\n",
        "df_test = create_embeddings(model, df_test)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "6G5TvLlmRjHc"
      },
      "outputs": [
        {
          "data": {
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "df_train"
            },
            "text/html": [
              "\n",
              "  <div id=\"df-f4a7c6eb-7d9c-4b92-a598-db8886c3b637\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Text</th>\n",
              "      <th>Label</th>\n",
              "      <th>Class Name</th>\n",
              "      <th>Encoded Label</th>\n",
              "      <th>Embeddings</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>1100</th>\n",
              "      <td>Re: Secret algorithm [Re: Clipper Chip and cr...</td>\n",
              "      <td>11</td>\n",
              "      <td>sci.crypt</td>\n",
              "      <td>0</td>\n",
              "      <td>[0.0036893487, 0.0015885577, -0.08848337, -0.0...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1101</th>\n",
              "      <td>Danny Weitzner &lt;&gt;Re-inventing Crypto Policy?  ...</td>\n",
              "      <td>11</td>\n",
              "      <td>sci.crypt</td>\n",
              "      <td>0</td>\n",
              "      <td>[-0.0015051058, -0.011516359, -0.05678679, -0....</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1102</th>\n",
              "      <td>Marc VanHeyningen &lt;&gt;How does it really work? \\...</td>\n",
              "      <td>11</td>\n",
              "      <td>sci.crypt</td>\n",
              "      <td>0</td>\n",
              "      <td>[0.021544674, -0.030707408, -0.056979053, -0.0...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1103</th>\n",
              "      <td>Re: Would \"clipper\" make a good cover for oth...</td>\n",
              "      <td>11</td>\n",
              "      <td>sci.crypt</td>\n",
              "      <td>0</td>\n",
              "      <td>[-0.012111008, -0.024126764, -0.07459716, -0.0...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1104</th>\n",
              "      <td>The battle is joined\\nNntp-Posting-Host: serv...</td>\n",
              "      <td>11</td>\n",
              "      <td>sci.crypt</td>\n",
              "      <td>0</td>\n",
              "      <td>[0.008676766, 0.013530727, -0.02739913, -0.039...</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-f4a7c6eb-7d9c-4b92-a598-db8886c3b637')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-f4a7c6eb-7d9c-4b92-a598-db8886c3b637 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-f4a7c6eb-7d9c-4b92-a598-db8886c3b637');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-2dd53f96-1fc5-4c92-9417-89ee84ab21d9\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-2dd53f96-1fc5-4c92-9417-89ee84ab21d9')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-2dd53f96-1fc5-4c92-9417-89ee84ab21d9 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "text/plain": [
              "                                                   Text  Label Class Name  \\\n",
              "1100   Re: Secret algorithm [Re: Clipper Chip and cr...     11  sci.crypt   \n",
              "1101  Danny Weitzner <>Re-inventing Crypto Policy?  ...     11  sci.crypt   \n",
              "1102  Marc VanHeyningen <>How does it really work? \\...     11  sci.crypt   \n",
              "1103   Re: Would \"clipper\" make a good cover for oth...     11  sci.crypt   \n",
              "1104   The battle is joined\\nNntp-Posting-Host: serv...     11  sci.crypt   \n",
              "\n",
              "      Encoded Label                                         Embeddings  \n",
              "1100              0  [0.0036893487, 0.0015885577, -0.08848337, -0.0...  \n",
              "1101              0  [-0.0015051058, -0.011516359, -0.05678679, -0....  \n",
              "1102              0  [0.021544674, -0.030707408, -0.056979053, -0.0...  \n",
              "1103              0  [-0.012111008, -0.024126764, -0.07459716, -0.0...  \n",
              "1104              0  [0.008676766, 0.013530727, -0.02739913, -0.039...  "
            ]
          },
          "execution_count": 15,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "df_train.head()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "QPYEYkIsWt_5"
      },
      "source": [
        "## Build a simple classification model\n",
        "Here you will define a simple model with one hidden layer and a single class probability output. The prediction will correspond to the probability of a piece of text being a particular class of news. When you build your model, Keras will automatically shuffle the data points."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "3oLGi4w5JsQR"
      },
      "outputs": [],
      "source": [
        "def build_classification_model(input_size: int, num_classes: int) -> keras.Model:\n",
        "  inputs = x = keras.Input(input_size)\n",
        "  x = layers.Dense(input_size, activation='relu')(x)\n",
        "  x = layers.Dense(num_classes, activation='sigmoid')(x)\n",
        "  return keras.Model(inputs=[inputs], outputs=x)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "kORA1Akl5GsG"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Model: \"model\"\n",
            "_________________________________________________________________\n",
            " Layer (type)                Output Shape              Param #   \n",
            "=================================================================\n",
            " input_1 (InputLayer)        [(None, 768)]             0         \n",
            "                                                                 \n",
            " dense (Dense)               (None, 768)               590592    \n",
            "                                                                 \n",
            " dense_1 (Dense)             (None, 4)                 3076      \n",
            "                                                                 \n",
            "=================================================================\n",
            "Total params: 593668 (2.26 MB)\n",
            "Trainable params: 593668 (2.26 MB)\n",
            "Non-trainable params: 0 (0.00 Byte)\n",
            "_________________________________________________________________\n"
          ]
        }
      ],
      "source": [
        "# Derive the embedding size from the first training element.\n",
        "embedding_size = len(df_train['Embeddings'].iloc[0])\n",
        "\n",
        "# Give your model a different name, as you have already used the variable name 'model'\n",
        "classifier = build_classification_model(embedding_size, len(df_train['Class Name'].unique()))\n",
        "classifier.summary()\n",
        "\n",
        "classifier.compile(loss = keras.losses.SparseCategoricalCrossentropy(from_logits=True),\n",
        "                   optimizer = keras.optimizers.Adam(learning_rate=0.001),\n",
        "                   metrics=['accuracy'])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "iPYYKnqFvt9x"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "768"
            ]
          },
          "execution_count": 18,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "embedding_size"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "kbpTGGiMXDxl"
      },
      "source": [
        "## Train the model to classify newsgroups\n",
        "\n",
        "Finally, you can train a simple model. Use a small number of epochs to avoid overfitting. The first epoch takes much longer than the rest, because the embeddings need to be computed only once."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "bGgvMZGfJ1A4"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Epoch 1/20\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.10/dist-packages/keras/src/backend.py:5729: UserWarning: \"`sparse_categorical_crossentropy` received `from_logits=True`, but the `output` argument was produced by a Softmax activation and thus does not represent logits. Was this intended?\n",
            "  output, from_logits = _get_logits(\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "13/13 [==============================] - 1s 30ms/step - loss: 1.2141 - accuracy: 0.6675 - val_loss: 0.9801 - val_accuracy: 0.8800\n",
            "Epoch 2/20\n",
            "13/13 [==============================] - 0s 12ms/step - loss: 0.7580 - accuracy: 0.9400 - val_loss: 0.6061 - val_accuracy: 0.9300\n",
            "Epoch 3/20\n",
            "13/13 [==============================] - 0s 13ms/step - loss: 0.4249 - accuracy: 0.9525 - val_loss: 0.3902 - val_accuracy: 0.9200\n",
            "Epoch 4/20\n",
            "13/13 [==============================] - 0s 13ms/step - loss: 0.2561 - accuracy: 0.9625 - val_loss: 0.2597 - val_accuracy: 0.9400\n",
            "Epoch 5/20\n",
            "13/13 [==============================] - 0s 13ms/step - loss: 0.1693 - accuracy: 0.9700 - val_loss: 0.2145 - val_accuracy: 0.9300\n",
            "Epoch 6/20\n",
            "13/13 [==============================] - 0s 13ms/step - loss: 0.1240 - accuracy: 0.9850 - val_loss: 0.1801 - val_accuracy: 0.9600\n",
            "Epoch 7/20\n",
            "13/13 [==============================] - 0s 21ms/step - loss: 0.0931 - accuracy: 0.9875 - val_loss: 0.1623 - val_accuracy: 0.9400\n",
            "Epoch 8/20\n",
            "13/13 [==============================] - 0s 16ms/step - loss: 0.0736 - accuracy: 0.9925 - val_loss: 0.1418 - val_accuracy: 0.9600\n",
            "Epoch 9/20\n",
            "13/13 [==============================] - 0s 20ms/step - loss: 0.0613 - accuracy: 0.9925 - val_loss: 0.1315 - val_accuracy: 0.9700\n",
            "Epoch 10/20\n",
            "13/13 [==============================] - 0s 20ms/step - loss: 0.0479 - accuracy: 0.9975 - val_loss: 0.1235 - val_accuracy: 0.9600\n",
            "Epoch 11/20\n",
            "13/13 [==============================] - 0s 19ms/step - loss: 0.0399 - accuracy: 0.9975 - val_loss: 0.1219 - val_accuracy: 0.9700\n",
            "Epoch 12/20\n",
            "13/13 [==============================] - 0s 21ms/step - loss: 0.0326 - accuracy: 0.9975 - val_loss: 0.1158 - val_accuracy: 0.9700\n",
            "Epoch 13/20\n",
            "13/13 [==============================] - 0s 19ms/step - loss: 0.0263 - accuracy: 1.0000 - val_loss: 0.1127 - val_accuracy: 0.9700\n",
            "Epoch 14/20\n",
            "13/13 [==============================] - 0s 17ms/step - loss: 0.0229 - accuracy: 1.0000 - val_loss: 0.1123 - val_accuracy: 0.9700\n",
            "Epoch 15/20\n",
            "13/13 [==============================] - 0s 20ms/step - loss: 0.0195 - accuracy: 1.0000 - val_loss: 0.1063 - val_accuracy: 0.9700\n",
            "Epoch 16/20\n",
            "13/13 [==============================] - 0s 17ms/step - loss: 0.0172 - accuracy: 1.0000 - val_loss: 0.1070 - val_accuracy: 0.9700\n"
          ]
        }
      ],
      "source": [
        "NUM_EPOCHS = 20\n",
        "BATCH_SIZE = 32\n",
        "\n",
        "# Split the x and y components of the train and validation subsets.\n",
        "y_train = df_train['Encoded Label']\n",
        "x_train = np.stack(df_train['Embeddings'])\n",
        "y_val = df_test['Encoded Label']\n",
        "x_val = np.stack(df_test['Embeddings'])\n",
        "\n",
        "# Train the model for the desired number of epochs.\n",
        "callback = keras.callbacks.EarlyStopping(monitor='accuracy', patience=3)\n",
        "\n",
        "history = classifier.fit(x=x_train,\n",
        "                         y=y_train,\n",
        "                         validation_data=(x_val, y_val),\n",
        "                         callbacks=[callback],\n",
        "                         batch_size=BATCH_SIZE,\n",
        "                         epochs=NUM_EPOCHS,)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "xGBaDHZUPdJO"
      },
      "source": [
        "## Evaluate model performance\n",
        "\n",
        "Use Keras <a href=\"https://www.tensorflow.org/api_docs/python/tf/keras/Model#evaluate\"><code>Model.evaluate</code></a> to get the loss and accuracy on the test dataset."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "d2kOeiqqQIB8"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "4/4 [==============================] - 0s 4ms/step - loss: 0.1070 - accuracy: 0.9700\n"
          ]
        },
        {
          "data": {
            "text/plain": [
              "{'loss': 0.10700511932373047, 'accuracy': 0.9700000286102295}"
            ]
          },
          "execution_count": 20,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "classifier.evaluate(x=x_val, y=y_val, return_dict=True)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "UyxMhiLYQXAN"
      },
      "source": [
        "One way to evaluate your model performance is to visualize the classifier performance. Use `plot_history` to see the loss and accuracy trends over the epochs."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "MaDO9hwbEOW3"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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ROkx1157LfPmzWPUqFEkJSVxyy230Llz59JvXUmSJElSRb3//vusXLmSMWPG0KFDh9LLueeeC7DHhvUVsbcZKyUzYn4oMTGRmJiY3Y49/vjjefPNN/nd737Ha6+9xrhx40qb3BcXF+93XcOGDePDDz9k2bJlLFy4kE8++cRZKpK0F/ZUkSRFRGZmJsnJyXzzzTe73Td37lxiYmJo0aJF6b4GDRowfPhwhg8fTm5uLkcddRS33347l112Wekx7dq14ze/+Q2/+c1vmD9/Pj169OC+++7j3//+d6U8J0mSJEk12+jRo2nUqBGPPvrobve98sorvPrqqzz++OO0a9eOWbNm7XOsdu3a8emnn1JYWEh8fPwej6lfvz4Q9JH8vsWLF5e55pkzZzJv3jyefvpphg0bVrp/3LhxuxxXsizzj9UNcP755zNixAief/55tm3bRnx8POedd16Za5Kk2sSZKpKkiIiNjeWEE07gP//5D999913p/tWrV/Pcc8/Rv39/0tLSAFi3bt0uj01JSaF9+/bk5+cDsHXrVvLy8nY5pl27dqSmppYeI0mSJEkVsW3bNl555RVOPfVUzj777N0uV199NZs3b+b111/nrLPO4ssvv+TVV1/dbZySJvRnnXUWa9eu5ZFHHtnrMa1atSI2NpaJEyfucv9f//rXMtcdGxu7y5gl2w8++OAux2VmZnLUUUfx5JNPsmTJkj3WUyIjI4OTTjqJf//734wePZoTTzyRjIyMMtckSbWJM1UkSfvtySef5O23395t/+233864cePo378/v/zlL4mLi+Nvf/sb+fn5/PnPfy49rkuXLgwcOJBDDz2UBg0a8Pnnn/PSSy9x9dVXAzBv3jyOO+44zj33XLp06UJcXByvvvoqq1ev5vzzz6+05ylJkiSp5nr99dfZvHkzp5122h7vP/zww8nMzGT06NE899xzvPTSS5xzzjlceumlHHrooaxfv57XX3+dxx9/nO7duzNs2DCeeeYZRowYwdSpUxkwYABbtmzhvffe45e//CWnn3466enpnHPOOTz88MOEQiHatWvHf//7X9asWVPmujt16kS7du24/vrrWb58OWlpabz88sts2LBht2Mfeugh+vfvT69evbjiiito06YN3333HW+++SYzZszY5dhhw4Zx9tlnA/CHP/yh7D9ISaplDFUkSfvtscce2+P+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sWwTc1dvpmB7cbRLKpPNeYV8vSKHnLztu90XFxPioMapdG2aTtfmQYjSuUkaSfGxUahUkqq+qIYqAwcOJLyP6do/DEomTJhwYAuqRDarlyRJVUZ8cvBt72icdz906tSJI444gieffJKBAweyYMECJk2axJ133klRURF33303L7zwAsuXL6egoID8/HySk8t2jjlz5tCiRYvSD0MB+vXrt9txY8eO5aGHHmLhwoXk5uayfft20tLS9ut5zJkzh+7du+/S4PrII4+kuLiYb775pvQD0YMPPpjY2J0fZjRp0oSZM2fu17mkShGt15CSc5eRryG+hkj7IxwOs2ZzPjOXfX9WRw6rcvbcmL26SIiNoVOT1B0zUNLp1iydjo1TSIwzQJGksnLOXpR0apJKfKzN6iVJUhUQCpV5Ga5o+9nPfsY111zDo48+yr/+9S/atWvH0UcfzZ/+9CcefPBBHnjgAbp160bdunW59tprKSgoiNi5P/74Yy688ELuuOMOBg8eTHp6OmPGjOG+++6L2Dm+Lz5+1/XIQ6EQxcXV49uwqmV8DSkTX0OkqiscDrNiU97OpuzLNzFzeQ5rc3dvzB4KBY3Zu+1YDis1qXr0DykJUzpmpRIfW+1aLEtSlWKoEiWJcbF0zEpl9oocZi7bZKgiSZJUBueeey6//vWvee6553jmmWe48sorCYVCfPTRR5x++ulcdNFFQNDfYN68eXTp0qVM43bu3JmlS5eycuVKmjQJ+t198sknuxwzZcoUWrVqxe9///vSfYsXL97lmISEBIqKin70XE899RRbtmwp/ab5Rx99RExMDAcddFCZ6pVUPr6GSAoas+/oK7J8EzOXb2L2ihzWb9k9RI0JQYdGqRzcLI1uzdKDviJN0qib6MdpklSb+X+BKCppVj9z+SZO6mazekmSpB+TkpLCeeedx8iRI8nJyeGSSy4BoEOHDrz00ktMmTKF+vXrc//997N69eoyfyA6aNAgOnbsyMUXX8w999xDTk7OLh98lpxjyZIljBkzht69e/Pmm2/y6quv7nJM69atWbRoETNmzKB58+akpqaSmJi4yzEXXnght912GxdffDG333472dnZXHPNNfz0pz8tXbZH0oHha4hUuxQXh1m8fmsQnOwIUGYt37TXviIdslLp1ixoyt61WTqdG6dRJ8FlsSRJu3K+XxR13dFXxWb1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wxQVFaWkpCRNnDhRW7ZssbqsduXxxx+XYRi6++67rS6lzdu3b5+uu+46xcfHKywsTAMGDNA333xjdVltltvt1owZM9SzZ0+FhYWpd+/eevjhh+X1eq0urU1ZsmSJJkyYoNTUVBmGoffee6/Bca/Xq4ceekidO3dWWFiYxowZo23btllTbBtxvPe0urpa999/vwYMGKCIiAilpqZq0qRJ2r9/v3UFtxEn+lk90m233SbDMPT8888HrD4AvsWYybcYN/kf4ybfYdzkW4ybfINxk+8xbvI9xkyBRagSQAsXLtS0adM0c+ZMrVmzRoMGDdLYsWOVk5NjdWlt0pdffqnbb79dK1as0OLFi1VdXa2LLrpIpaWlVpfWLqxatUp//etfNXDgQKtLafMOHTqkUaNGKSQkRB9//LG+//57PfPMM4qNjbW6tDbriSee0EsvvaTZs2dr06ZNeuKJJ/Tkk0/qxRdftLq0NqW0tFSDBg3SnDlzmjz+5JNP6oUXXtDLL7+slStXKiIiQmPHjlVFRUWAK207jveelpWVac2aNZoxY4bWrFmjd955R1u2bNHPfvYzCyptW070s1rn3Xff1YoVK5SamhqgygD4GmMm32Pc5F+Mm3yHcZPvMW7yDcZNvse4yfcYMwWYFwEzfPhw7+23317/tdvt9qampnpnzZplYVXtR05OjleS98svv7S6lDavuLjY26dPH+/ixYu9559/vveuu+6yuqQ27f777/eee+65VpfRrowfP9570003Ndh36aWXeq+99lqLKmr7JHnffffd+q89Ho83JSXF+9RTT9XvKygo8LpcLu+bb75pQYVtz9HvaVMyMjK8kry7d+8OTFHtwLHe171793q7dOni3bhxo7d79+7e5557LuC1ATh5jJn8j3GT7zBu8i3GTb7HuMn3GDf5HuMm32PM5H90qgRIVVWVVq9erTFjxtTvs9lsGjNmjJYvX25hZe1HYWGhJCkuLs7iStq+22+/XePHj2/w84rWe//99zV06FBdfvnlSkpK0plnnql58+ZZXVabds455yg9PV1bt26VJK1bt07Lli3TxRdfbHFl7cfOnTuVlZXV4P8DMTExGjFiBP9u+VBhYaEMw1CnTp2sLqVN83g8uv7663XffffpjDPOsLocAK3EmCkwGDf5DuMm32Lc5HuMm/yPcVNgMG46eYyZfMthdQEdRV5entxut5KTkxvsT05O1ubNmy2qqv3weDy6++67NWrUKPXv39/qctq0BQsWaM2aNVq1apXVpbQbO3bs0EsvvaRp06bpwQcf1KpVq/Sb3/xGTqdTN9xwg9XltUkPPPCAioqKdNppp8lut8vtduvRRx/Vtddea3Vp7UZWVpYkNfnvVt0xnJyKigrdf//9uvrqqxUdHW11OW3aE088IYfDod/85jdWlwLgJDBm8j/GTb7DuMn3GDf5HuMm/2Pc5H+Mm3yDMZNvEaqgXbj99tu1ceNGLVu2zOpS2rTMzEzdddddWrx4sUJDQ60up93weDwaOnSoHnvsMUnSmWeeqY0bN+rll19mcNBKb731ll5//XW98cYbOuOMM7R27VrdfffdSk1N5T1Fm1BdXa0rrrhCXq9XL730ktXltGmrV6/Wn//8Z61Zs0aGYVhdDgAENcZNvsG4yT8YN/ke4ya0dYybfIMxk+8x/VeAJCQkyG63Kzs7u8H+7OxspaSkWFRV+3DHHXfogw8+0Oeff66uXbtaXU6btnr1auXk5Oiss86Sw+GQw+HQl19+qRdeeEEOh0Nut9vqEtukzp07q1+/fg32nX766dqzZ49FFbV99913nx544AFdddVVGjBggK6//nr99re/1axZs6wurd2o+7eJf7d8r25gsHv3bi1evJi/tjpJS5cuVU5Ojrp161b/b9fu3bt1zz33qEePHlaXB6AFGDP5F+Mm32Hc5B+Mm3yPcZP/MW7yH8ZNvsOYyfcIVQLE6XRqyJAhSk9Pr9/n8XiUnp6ukSNHWlhZ2+X1enXHHXfo3Xff1WeffaaePXtaXVKbd+GFF2rDhg1au3Zt/TZ06FBde+21Wrt2rex2u9UltkmjRo3Sli1bGuzbunWrunfvblFFbV9ZWZlstob/hNntdnk8Hosqan969uyplJSUBv9uFRUVaeXKlfy7dRLqBgbbtm3Tp59+qvj4eKtLavOuv/56rV+/vsG/Xampqbrvvvv0ySefWF0egBZgzOQfjJt8j3GTfzBu8j3GTf7HuMk/GDf5FmMm32P6rwCaNm2abrjhBg0dOlTDhw/X888/r9LSUk2ePNnq0tqk22+/XW+88Yb+85//KCoqqn6uypiYGIWFhVlcXdsUFRXVaG7liIgIxcfHM+fySfjtb3+rc845R4899piuuOIKZWRkaO7cuZo7d67VpbVZEyZM0KOPPqpu3brpjDPO0Lfffqtnn31WN910k9WltSklJSXavn17/dc7d+7U2rVrFRcXp27duunuu+/WI488oj59+qhnz56aMWOGUlNTNXHiROuKDnLHe087d+6syy67TGvWrNEHH3wgt9td/29XXFycnE6nVWUHvRP9rB49yAoJCVFKSor69u0b6FIBnCTGTL7HuMn3GDf5B+Mm32Pc5BuMm3yPcZPvMWYKMC8C6sUXX/R269bN63Q6vcOHD/euWLHC6pLaLElNbq+++qrVpbUr559/vveuu+6yuow277///a+3f//+XpfL5T3ttNO8c+fOtbqkNq2oqMh71113ebt16+YNDQ319urVy/t///d/3srKSqtLa1M+//zzJv8/esMNN3i9Xq/X4/F4Z8yY4U1OTva6XC7vhRde6N2yZYu1RQe5472nO3fuPOa/XZ9//rnVpQe1E/2sHq179+7e5557LqA1AvAdxky+xbgpMBg3+QbjJt9i3OQbjJt8j3GT7zFmCizD6/V6fRnSAAAAAAAAAAAAtEesqQIAAAAAAAAAANAMhCoAAAAAAAAAAADNQKgCAAAAAAAAAADQDIQqAAAAAAAAAAAAzUCoAgAAAAAAAAAA0AyEKgAAAAAAAAAAAM1AqAIAAAAAAAAAANAMhCoAAAAAAAAAAADNQKgCAAh6hmHovffes7oMAAAAAAhKjJkAIHAIVQAAx3XjjTfKMIxG27hx46wuDQAAAAAsx5gJADoWh9UFAACC37hx4/Tqq6822OdyuSyqBgAAAACCC2MmAOg46FQBAJyQy+VSSkpKgy02NlaS2Wb+0ksv6eKLL1ZYWJh69eqlf/3rXw2u37Bhg3784x8rLCxM8fHxmjJlikpKShqc88orr+iMM86Qy+VS586ddccddzQ4npeXp1/84hcKDw9Xnz599P777/v3RQMAAABAMzFmAoCOg1AFAHDSZsyYoV/+8pdat26drr32Wl111VXatGmTJKm0tFRjx45VbGysVq1apbfffluffvppgwHASy+9pNtvv11TpkzRhg0b9P777+uUU05p8D3++Mc/6oorrtD69et1ySWX6Nprr9XBgwcD+joBAAAAoDUYMwFA+2F4vV6v1UUAAILXjTfeqH/+858KDQ1tsP/BBx/Ugw8+KMMwdNttt+mll16qP3b22WfrrLPO0l/+8hfNmzdP999/vzIzMxURESFJ+uijjzRhwgTt379fycnJ6tKliyZPnqxHHnmkyRoMw9Dvf/97Pfzww5LMQUdkZKQ+/vhj5ikGAAAAYCnGTADQsbCmCgDghC644IIGAwBJiouLq38+cuTIBsdGjhyptWvXSpI2bdqkQYMG1Q8OJGnUqFHyeDzasmWLDMPQ/v37deGFFx63hoEDB9Y/j4iIUHR0tHJyclr7kgAAAADAZxgzAUDHQagCADihiIiIRq3lvhIWFtas80JCQhp8bRiGPB6PP0oCAAAAgBZhzAQAHQdrqgAATtqKFSsafX366adLkk4//XStW7dOpaWl9ce/+uor2Ww29e3bV1FRUerRo4fS09MDWjMAAAAABApjJgBoP+hUAQCcUGVlpbKyshrsczgcSkhIkCS9/fbbGjp0qM4991y9/vrrysjI0Pz58yVJ1157rWbOnKkbbrhBf/jDH5Sbm6s777xT119/vZKTkyVJf/jDH3TbbbcpKSlJF198sYqLi/XVV1/pzjvvDOwLBQAAAIBWYMwEAB0HoQoA4IQWLVqkzp07N9jXt29fbd68WZL0xz/+UQsWLNCvf/1rde7cWW+++ab69esnSQoPD9cnn3yiu+66S8OGDVN4eLh++ctf6tlnn62/1w033KCKigo999xzuvfee5WQkKDLLrsscC8QAAAAAE4CYyYA6DgMr9frtboIAEDbZRiG3n33XU2cONHqUgAAAAAg6DBmAoD2hTVVAAAAAAAAAAAAmoFQBQAAAAAAAAAAoBmY/gsAAAAAAAAAAKAZ6FQBAAAAAAAAAABoBkIVAAAAAAAAAACAZiBUAQAAAAAAAAAAaAZCFQAAAAAAAAAAgGYgVAEAAAAAAAAAAGgGQhUAAAAAAAAAAIBmIFQBAAAAAAAAAABoBkIVAAAAAAAAAACAZvj/B+SwsWE5YP0AAAAASUVORK5CYII=",
            "text/plain": [
              "<Figure size 2000x800 with 2 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "def plot_history(history):\n",
        "  \"\"\"\n",
        "    Plotting training and validation learning curves.\n",
        "\n",
        "    Args:\n",
        "      history: model history with all the metric measures\n",
        "  \"\"\"\n",
        "  fig, (ax1, ax2) = plt.subplots(1,2)\n",
        "  fig.set_size_inches(20, 8)\n",
        "\n",
        "  # Plot loss\n",
        "  ax1.set_title('Loss')\n",
        "  ax1.plot(history.history['loss'], label = 'train')\n",
        "  ax1.plot(history.history['val_loss'], label = 'test')\n",
        "  ax1.set_ylabel('Loss')\n",
        "\n",
        "  ax1.set_xlabel('Epoch')\n",
        "  ax1.legend(['Train', 'Validation'])\n",
        "\n",
        "  # Plot accuracy\n",
        "  ax2.set_title('Accuracy')\n",
        "  ax2.plot(history.history['accuracy'],  label = 'train')\n",
        "  ax2.plot(history.history['val_accuracy'], label = 'test')\n",
        "  ax2.set_ylabel('Accuracy')\n",
        "  ax2.set_xlabel('Epoch')\n",
        "  ax2.legend(['Train', 'Validation'])\n",
        "\n",
        "  plt.show()\n",
        "\n",
        "plot_history(history)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "kOgva0pbP4FS"
      },
      "source": [
        "Another way to view model performance, beyond just measuring loss and accuracy is to use a confusion matrix. The confusion matrix allows you to assess the performance of the classification model beyond accuracy. You can see what misclassified points get classified as. In order to build the confusion matrix for this multi-class classification problem, get the actual values in the test set and the predicted values.\n",
        "\n",
        "Start by generating the predicted class for each example in the validation set using [`Model.predict()`](https://www.tensorflow.org/api_docs/python/tf/keras/Model#predict)."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "PRUx5ao9QRcO"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "4/4 [==============================] - 0s 4ms/step\n"
          ]
        }
      ],
      "source": [
        "y_hat = classifier.predict(x=x_val)\n",
        "y_hat = np.argmax(y_hat, axis=1)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "CVidbr0OT5tL"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "{'sci.crypt': 0, 'sci.electronics': 1, 'sci.med': 2, 'sci.space': 3}"
            ]
          },
          "execution_count": 23,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "labels_dict = dict(zip(df_test['Class Name'], df_test['Encoded Label']))\n",
        "labels_dict"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "3ae76701e178"
      },
      "outputs": [
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAksAAAIbCAYAAAD7M9r1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB21klEQVR4nO3dd1RUV9cG8GdAqvQmoIggiqLYo1GswUAwakSNkZiIPRaw1xgLNoyJXYMxdqOvSdSoMUZFbNgwsRsriB0VRbrUOd8ffEwcKYJzYWB4fmvdpXPmlj2XYdhzzr7nyoQQAkRERESULy11B0BERERUljFZIiIiIioEkyUiIiKiQjBZIiIiIioEkyUiIiKiQjBZIiIiIioEkyUiIiKiQjBZIiIiIioEkyUiIiKiQjBZonLj9u3b8PLygqmpKWQyGXbt2iXp/u/evQuZTIYNGzZIul9NUKNGDfTr10+y/T19+hQ9e/aEpaUlZDIZlixZItm+iVSxYcMGyGQy3L17V92hUBnCZImKJSoqCl999RWcnZ2hr68PExMTeHh4YOnSpXj16lWJHtvf3x9XrlzB3LlzsXnzZjRr1qxEj6eJrl27hpkzZ6r9D8GYMWNw4MABTJkyBZs3b8ZHH32k1nioZO3btw8zZ84s0WOkpqZi5syZOHr0aIkepzBbt24tM4l/WTgfGkUQFdHevXuFgYGBMDMzEyNHjhSrV68WK1asEL179xY6Ojpi8ODBJXbs1NRUAUBMnTq1xI4hl8vFq1evRFZWVokdQ91+++03AUAcOXKkWNulpaWJjIwMyeKoUqWK6NOnj2T7o7JtxIgRoqT/3MTGxgoAYsaMGSrtZ/369QKAiI6OLva2H3/8sXB0dFTp+FKR6nxQjkrqTNSo/IiOjkbv3r3h6OiIw4cPw87OTvHciBEjEBkZiT///LPEjh8bGwsAMDMzK7FjyGQy6Ovrl9j+yxshBNLS0mBgYAA9PT1J9/3s2TNJf5ZpaWnQ1dWFllbF7ixPSUlB5cqV1R0GkeZRd7ZG5cPQoUMFAHHy5MkirZ+ZmSlmzZolnJ2dha6urnB0dBRTpkwRaWlpSus5OjqKjz/+WISHh4v33ntP6OnpCScnJ7Fx40bFOjNmzBAAlJbcb2/+/v75fpPL3eZ1Bw8eFB4eHsLU1FRUrlxZ1K5dW0yZMkXxfHR0tAAg1q9fr7RdWFiYaN26tTA0NBSmpqaia9eu4tq1a/ke7/bt28Lf31+YmpoKExMT0a9fP5GSkvLW89WuXTtRr149cenSJdG2bVthYGAgatasKX777TchhBBHjx4VzZs3F/r6+qJ27doiNDRUafu7d++KYcOGidq1awt9fX1hYWEhevbsqfTtOPcb85tLbi9T7s9i//79omnTpkJPT08sXrxY8Zy/v78QIqcHrn379sLKyko8ffpUsf/09HRRv3594ezsLJKTk/N9nQXFkCsqKkr07NlTmJubCwMDA9GiRQuxd+9epX0cOXJEABD/+9//xNSpU4W9vb2QyWTi5cuX+R4z9+f63XffiR9//FHxnmzWrJk4e/ZsnvWvX78uevToIczNzYWenp5o2rSp2L17t+L5ly9fCi0tLbF06VJFW2xsrJDJZMLCwkLI5XJF+9ChQ0WVKlUUj2/duiW6d+8uqlSpIvT09ETVqlXFZ599JuLj4xXrpKamisDAQGFpaSmMjIxEly5dxMOHD/P0EuS+5/7991/h5+cnzMzMRKNGjYQQRf/9e3OfuV7/eQvx38/t2LFjYsiQIcLCwkIYGxuLL7/8UsTFxeV73nP5+/sX+jPPzs4WixcvFm5ubkJPT0/Y2NiIIUOG5Nnv33//Lby8vISlpaXQ19cXNWrUEP379xdC/PczfnN5W6/K1atXRYcOHYS+vr6oWrWqmD17tli7dm2enqVdu3aJTp06CTs7O6GrqyucnZ3FrFmzlHqh27VrV+DnVHp6upg2bZpo0qSJMDExEYaGhqJ169bi8OHDeWL63//+J5o0aSKMjIyEsbGxqF+/vliyZInSOi9fvhSjRo0S1apVE7q6uqJmzZpi/vz5Ijs7W6XzQQVjzxIVyR9//AFnZ2e0atWqSOsPGjQIGzduRM+ePTFu3DhEREQgODgY169fx++//660bmRkJHr27ImBAwfC398f69atQ79+/dC0aVPUq1cP3bt3h5mZGcaMGQM/Pz906tQJRkZGxYr/33//RefOndGgQQPMmjULenp6iIyMxMmTJwvd7tChQ/Dx8YGzszNmzpyJV69eYfny5fDw8MD58+dRo0YNpfV79eoFJycnBAcH4/z581izZg1sbGzw7bffvjXGly9fonPnzujduzc+/fRThISEoHfv3tiyZQtGjx6NoUOH4vPPP8d3332Hnj174sGDBzA2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niUiIiKSBofhiIiIiApXFofRVMVkiYiIiKQhRM6i6j7KGNYsERERERWCPUtEREQkCU29Go7JEhEREUlDQwu8OQxHREREVAj2LBEREZEkZPKcRdV9lDVMloiIiEgaHIYjIiIiqnjYs0RERESS4NVwRERERIXhpJREREREFQ97lojKoOzERHWHUOH0q95a3SFUKAceX1R3CBVGYpIc5rVL51gchiMiIiIqjIZeDcdkiYiIiCShqT1LrFkiIiIiKgR7loiIiEgaGno1HJMlIiIikgSH4YiIiIgqIPYsERERkTR4NRwRERFRwTgMR0RERFQBsWeJiIiIpCEXOYuq+yhjmCwRERGRNFizRERERFQwGSSoWZIkEmmxZomIiIioEOxZIiIiImlwBm8iIiKignHqACIiIqIyZObMmZDJZEpLnTp1JD8Oe5aIiIhIGmq4Gq5evXo4dOiQ4nGlStKnNkyWiIiISBIyISBTseYod/vExESldj09Pejp6eVZv1KlSrC1tVXpmG/DYTgiIiIqcxwcHGBqaqpYgoOD813v9u3bsLe3h7OzM/r06YP79+9LHgt7loiIiEga8v9fVN0HgAcPHsDExETRnF+vUosWLbBhwwa4uroiJiYGQUFBaNOmDa5evQpjY2MVA/kPkyUiIiKShJTDcCYmJkrJUn58fHwU/2/QoAFatGgBR0dH/Prrrxg4cKBKcbyOw3BERESkEczMzFC7dm1ERkZKul8mS0RERCQNIdHyjpKTkxEVFQU7O7t330k+mCwRERGRNHJn8FZ1KaLx48fj2LFjuHv3Lk6dOgVfX19oa2vDz89P0pfFmiUiIiKSRGnP4P3w4UP4+fnhxYsXsLa2RuvWrXHmzBlYW1urFsQbmCwRERFRubRt27ZSOQ6TJSIiIpIGb6RLREREVDCZPGdRdR9lDQu8iYiIiArBniUiIiKSBofhiIiIiAqh4jxJin2UMRyGIyIiIioEe5aIiIhIElLeG64sYbJERERE0tDQmiUOwxEREREVgj1LREREJA0BQNV5kspexxKTJSIiIpIGa5aIiIiICiMgQc2SJJFIijVLRERERIVgzxIRERFJQ0OvhmOyRERERNKQA5BJsI8yhsmSimQyGX7//Xd069ZN3aHQa7r0e46ew57BwjoLd64Z4IdvquLmRUN1h6XReM5LF893ydi23AYn95nhQaQe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",
            "text/plain": [
              "<Figure size 640x480 with 2 Axes>"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "cm = skmetrics.confusion_matrix(y_val, y_hat)\n",
        "disp = skmetrics.ConfusionMatrixDisplay(confusion_matrix=cm,\n",
        "                              display_labels=labels_dict.keys())\n",
        "disp.plot(xticks_rotation='vertical')\n",
        "plt.title('Confusion matrix for newsgroup test dataset');\n",
        "plt.grid(False)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "S9ISDJBCcDT2"
      },
      "source": [
        "## Next steps\n",
        "\n",
        "To learn how to use other services in the Gemini API, see the [Python quickstart](https://ai.google.dev/tutorials/python_quickstart).\n",
        "\n",
        "To learn more about how you can use embeddings, see these  other tutorials:\n",
        "\n",
        " * [Anomaly Detection with Embeddings](https://ai.google.dev/gemini-api/tutorials/anomaly_detection)\n",
        " * [Clustering with Embeddings](https://ai.google.dev/gemini-api/tutorials/clustering_with_embeddings)\n",
        " * [Document Search with Embeddings](https://ai.google.dev/gemini-api/tutorials/document_search)\n"
      ]
    }
  ],
  "metadata": {
    "colab": {
      "name": "text_classifier_embeddings.ipynb",
      "toc_visible": true
    },
    "google": {
      "image_path": "/examples/train_text_classifier_embeddings_files/output_3ae76701e178_0.png",
      "keywords": [
        "examples",
        "googleai",
        "samplecode",
        "python",
        "embed"
      ]
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
